generování tlačítka procedurou

Otázka od: SCHWARZ Karel

18. 12. 2002 14:35

Zdravim,

mam tento problem:

pri kliknuti na menu spoustim proceduru ktera mimo jine vytvori formular a na
nem vytvori combobox a tlacitka (OK a Cancel)
Potreboval bych nejak osetrit odalosti OKButton.OnClick a CancelButton.OnClick
ale nejak si s tim nevim rady...

totiz - ve zdrojaku k tomu nic nepriradim (uz jsem takovy jeden program psal a
tam to slo celkem v pohode... ale rozdil byl v tom, ze se ten formular
nevytvarel procedurou ale primo v prostredi Delphi pri psani programu) furt to
hlasi

[Error] procedury.pas(597): Incompatible types: method pointer and regular
procedure

kdyz to priradim takto: KonsOK.OnClick:=kons_tlacitko_click;

(kons_tlacitko_click je procedura která přiřazuje proměnné nějakou hodnotu
podle toho jestli bylo stisknuto OK nebo Cancel)

dik za rady

Karel Schwarz
--------------------------------------------------------
Produkcni centrum, GfK Praha
Geologicka 2, Praha 5 Barrandov
tel. +420 296 555 655
Internet: http://www.gfk.cz

Odpovedá: Ondrej Kelle

18. 12. 2002 16:01

> pri kliknuti na menu spoustim proceduru ktera mimo jine
> vytvori formular a na nem vytvori combobox a tlacitka (OK a Cancel)
> Potreboval bych nejak osetrit odalosti OKButton.OnClick a
> CancelButton.OnClick ale nejak si s tim nevim rady...
>
> totiz - ve zdrojaku k tomu nic nepriradim (uz jsem takovy
> jeden program psal a tam to slo celkem v pohode... ale rozdil
> byl v tom, ze se ten formular nevytvarel procedurou ale primo
> v prostredi Delphi pri psani programu) furt to hlasi
>
> [Error] procedury.pas(597): Incompatible types: method
> pointer and regular procedure
>
> kdyz to priradim takto: KonsOK.OnClick:=kons_tlacitko_click;
>
> (kons_tlacitko_click je procedura která přiřazuje proměnné
> nějakou hodnotu podle toho jestli bylo stisknuto OK nebo Cancel)

Kedze typ TNotifyEvent je definovany ako procedure(Sender: TObject) of
object, musi to byt metoda nejakej triedy, nie obycajna procedura. Rozdiel
je v tom, ze metoda obsahuje skryty parameter Self.
Takze bud pouzi nejaku triedu, alebo to mozes obist nejako takto:

procedure ButtonClickProc(Self, Sender: TObject);
begin
  ShowMessage(Format('%s.OnClick', [(Sender as TComponent).Name]));
end;

procedure TForm1.CreateButton;
var
  Method: TMethod;
begin
  FButton := TButton.Create(Self);
  try
    FButton.Parent := Self;
    FButton.Name := 'Button1';
    FButton.Left := 8;
    FButton.Top := 8;
    Method.Code := @ButtonClickProc;
    Method.Data := Self;
    FButton.OnClick := TNotifyEvent(Method);
  except
    FreeAndNil(FButton);
    raise;
  end;
end;

HTH
TOndrej

Odpovedá: Petr Brant

18. 12. 2002 15:09

Patrne mas v te procedure spatne parametry nebo ji nedeklarujes uvnitr
definice objektu tridy formu. Implementace by mela vypadat takto:

procedure kons_tlacitko_click(Sender: TObject);
begin
 ...
end;

A deklaraci procedury musis uvest do definice tridy objektu, tedy napr.

type
  TUserOptionsWnd = class(TForm)
...
procedure kons_tlacitko_click(Sender: TObject);
...
end;

RNDr. Petr Brant [brant@dcomm.cz]
http://web.redbox.cz/petr.brant

D&COMM s.r.o.
Korunovační 6
Praha 7
tel. +420724007234

 Subject: generování tlačítka procedurou


 pri kliknuti na menu spoustim proceduru ktera mimo jine vytvori
formular a na nem vytvori combobox a tlacitka (OK a Cancel)
 Potreboval bych nejak osetrit odalosti OKButton.OnClick a
CancelButton.OnClick ale nejak si s tim nevim rady...

 totiz - ve zdrojaku k tomu nic nepriradim (uz jsem takovy jeden
program psal a tam to slo celkem v pohode... ale rozdil byl v tom, ze se ten
formular nevytvarel procedurou ale primo v prostredi Delphi pri psani
programu) furt to hlasi

 [Error] procedury.pas(597): Incompatible types: method pointer and
regular procedure

 kdyz to priradim takto: KonsOK.OnClick:=kons_tlacitko_click;

 (kons_tlacitko_click je procedura která přiřazuje proměnné nějakou
hodnotu podle toho jestli bylo stisknuto OK nebo Cancel)

Odpovedá: Ing. Jiri SOKOL

18. 12. 2002 15:50

Dne 18. prosinec 2002, <delphi-l@clexpert.cz> napsal:

> Zdravim,
>
> mam tento problem:
>
> pri kliknuti na menu spoustim proceduru ktera mimo jine vytvori formular a na
nem vytvori combobox a tlacitka (OK a Cancel)
> Potreboval bych nejak osetrit odalosti OKButton.OnClick a
CancelButton.OnClick ale nejak si s tim nevim rady...
>
> totiz - ve zdrojaku k tomu nic nepriradim (uz jsem takovy jeden program psal
a tam to slo celkem v pohode... ale rozdil byl v tom, ze se ten formular
nevytvarel procedurou ale primo v prostredi Delphi pri psani programu) furt to
hlasi
>
> [Error] procedury.pas(597): Incompatible types: method pointer and regular
procedure
>
> kdyz to priradim takto: KonsOK.OnClick:=kons_tlacitko_click;
>
> (kons_tlacitko_click je procedura která přiřazuje proměnné nějakou hodnotu
podle toho jestli bylo stisknuto OK nebo Cancel)
>
> dik za rady

Ahoj.

Jak resit Tvuj problem ... variant je nekolik. Davam dve:
1) a to si muzes vyzkouset jako samostatny projekt - modalne zobrazit formular
a tlacitku priradit
modalresult na OK=mrOK a Storno=mrCancel. Modalni formular se Ti spusti a Tvuj
program ceka na
vysledek. Pak si jenom vytahnes hodnotu, kterou Ti vrati a je to.
2) dynamicke vytvareni - to je Ti , soude z Tveho dotazu, jasne. Nenapsal jsi,
kdo je
vlastnikem(rodicem) toho vytvareneho formu. Neni chybou, ze pri definici
udalosti OnClick nepises
OnClick:=form1.kons_tlacitko_click; ???

dalsim resenim by bylo ... pri vytvareni objektu nasledne znas jeho handle.
Vis, ze cekas na
urcitou zpravu pro urcite okno, takze by to slo prinejhorsim resit i pres
odchyt zprav. Skoda, ze
jsi neposlal ten vytvareci kod ... rady by byly konkretnejsi ...

Ahoj, Jirka

Ing. Jiri Sokol, js-delphi@seznam.cz, +420251431187
D6ProfSP2,WinNT
amatersky
programator

______________________________________________________________________
Reklama:
FIMFARUM - Cesky celovecerni loutkovy film na motivy pohadek Jana Wericha.
www.fimfarum.cz V kinech od 28. listopadu. http://www.fimfarum.cz